package application;
import java.util.*;

/**
*	@(#) StateRecorder.java
*
*	Une classe qui va servir d'enregistreur des etats de l'editeur. Elle est
*	necessaire a la mise en oeuvre des actions annuler/refaire.
*/
public class StateRecorder {

	/**
	*	La liste des mementos correspondants aux etats de l'editeur enegistres. 
	*/
	private ArrayList<Memento> states;
	
	/**
	*	Indice reperant le dernier etat enregistre ou restaure. 
	*/
	private int statePointer;
	
	/**
	*	L'editeur dont on va sauvegarder les etats. 
	*/
	private Editor editor;
	
	/**
	*	L'interface homme-machine dans laquelle les commandes sont jouees. 
	*/
	private UI ui;
	
	/**
	*	Constructeur StateRecorder.
	*/
	public StateRecorder(Editor editor, UI ui) {
		this.states = new ArrayList<Memento>();
		this.editor=editor;
		this.statePointer=-1;
		this.ui=ui;
	}
	
	/** 
	*	@return L'indice du dernier etat enregistre ou restaure.
	*/
	public int getStatePointer() {
		return statePointer;
	}

	/**
	*	Met a jour l'indice du dernier etat enregistre ou restaure.
	*
	*	@param statePointer
	*					Le nouveau indice.
	*/
	public void setStatePointer(int statePointer) {
		this.statePointer=statePointer;
	}

	/**
	*	Incremente de 1 l'indice du dernier etat enregistre ou restaure.
	*/
	public void increaseStatePointer() {
		statePointer++;
	}
	
	/**
	*	On va enregistrer un memento correspondant a l'etat de l'editeur.
	*/
	public void recordState() {
		Memento temp=editor.getMemento();	
		statePointer++;
		states.add(statePointer,temp);
	}
	
	/**
	*	On va restaurer l'etat de l'editeur grace a un memento enregistre dans la liste.
	*/
	public int restoreState(int indexToRestore, int interval) {
		Memento state;
		int ptrTemp=statePointer;
		// On verifie qu'il y a deja eu des actions et que l'on est pas juste sur 
		// l'intervalle de sauvegarde.
		if ((indexToRestore != 0) && (indexToRestore+1)%interval==0) {
			statePointer--;
			state = states.get(((indexToRestore+1)/interval)-1);
		}
		else{state = states.get((indexToRestore+1)/interval);}
		
		editor.setMemento(state);
		Triplet<Buffer, Selection, ClipBoard> t = (Triplet<Buffer, Selection, ClipBoard>)state.getState().getState();
		ui.refresh(t.getFirst().getText(),t.getSecond().getBegin(),t.getSecond().getEnd());
		return statePointer*interval;
	}
	
}
